//package org.example.javax.jta;
//
///**
// * @author juntao zhang
// */
//
//import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
//
//import javax.sql.XAConnection;
//import javax.sql.XADataSource;
//import javax.transaction.xa.XAException;
//import javax.transaction.xa.XAResource;
//import javax.transaction.xa.Xid;
//import java.sql.Connection;
//import java.sql.SQLException;
//import java.sql.Statement;
//
//public class XADemo {
//  private static class MyXid implements Xid {
//
//    int formatId;
//
//    byte gtrid[];
//
//    byte bqual[];
//
//    MyXid(int formatId, byte[] gtrid, byte[] bqual) {
//      this.formatId = formatId;
//      this.gtrid = gtrid;
//      this.bqual = bqual;
//    }
//
//    public MyXid() {
//    }
//
//    public int getFormatId() {
//      return formatId;
//    }
//
//    public byte[] getGlobalTransactionId() {
//      return gtrid;
//    }
//
//    public byte[] getBranchQualifier() {
//      return bqual;
//    }
//  }
//
//  public static void main(String[] args) throws XAException {
//    XADataSource xaDs1 = getDataSource("jdbc:mysql://localhost:3306/ads_ms", "root", "root");
//    XAConnection xaCon1 = null;
//    XAResource xaRes1 = null;
//    Connection conn1 = null;
//    Statement stmt1 = null;
//
//
//    XADataSource xaDs2 = getDataSource("jdbc:mysql://localhost:3306/ads_ms_lz", "root", "root");
//    XAConnection xaCon2 = null;
//    XAResource xaRes2 = null;
//    Connection conn2 = null;
//    Statement stmt2 = null;
//
//    int ret1 = 0;
//    int ret2 = 0;
//
//    Xid xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
//    Xid xid2 = new MyXid(100, new byte[]{0x01}, new byte[]{0x03});
//    try {
//      xaCon1 = getXAConnetion(xaDs1);
//      conn1 = getConnection(xaCon1);
//      stmt1 = conn1.createStatement();
//      xaRes1 = xaCon1.getXAResource();
//
//      xaCon2 = getXAConnetion(xaDs2);
//      conn2 = getConnection(xaCon2);
//      stmt2 = conn2.createStatement();
//      xaRes2 = xaCon2.getXAResource();
//      Long id = System.currentTimeMillis();
//      xaRes1.start(xid1, XAResource.TMNOFLAGS);
//      stmt1.execute("INSERT INTO mx_user (uid,name,add_time) VALUES (" + id + ",'aaabbb'," + System.currentTimeMillis() + ")");
//      xaRes1.end(xid1, XAResource.TMSUCCESS);
//
//      if (xaRes2.isSameRM(xaRes1)) {
//        xaRes2.start(xid1, XAResource.TMNOFLAGS);
//        stmt2.execute("INSERT INTO mx_user (uid,name,add_time) VALUES (" + id + ",'aaabbb'," + System.currentTimeMillis() + ")");
//        xaRes2.end(xid1, XAResource.TMSUCCESS);
//      } else {
//        xaRes2.start(xid2, XAResource.TMNOFLAGS);
//        stmt2.execute("INSERT INTO mx_user (uid,name,add_time) VALUES (" + id + ",'aaabbb'," + System.currentTimeMillis() + ")");
//        xaRes2.end(xid2, XAResource.TMSUCCESS);
//        ret2 = xaRes2.prepare(xid2);
//      }
//      ret1 = xaRes1.prepare(xid1);
//      if (ret1 == XAResource.XA_OK && ret2 == XAResource.XA_OK) {
////        if (true) throw new RuntimeException("test");
//        xaRes1.commit(xid1, false);
//        if (xaRes2.isSameRM(xaRes1)) {
//          xaRes2.commit(xid1, false);
//        } else {
//          xaRes2.commit(xid2, false);
//        }
//      }
//    } catch (Exception e) {
//      e.printStackTrace();
//      if (xaRes1 != null) {
//        xaRes1.rollback(xid1);
//      }
//      if (xaRes2 != null) {
//        if (xaRes2.isSameRM(xaRes1)) {
//          xaRes2.rollback(xid1);
//        } else {
//          xaRes2.rollback(xid2);
//        }
//      }
//    }
//  }
//
//
//  private static XADataSource getDataSource(String url, String user, String password) {
//    MysqlXADataSource dataSource = new MysqlXADataSource();
//    dataSource.setUrl(url);
//    dataSource.setUser(user);
//    dataSource.setPassword(password);
//    return dataSource;
//  }
//
//
//  public static XAConnection getXAConnetion(XADataSource dataSource) {
//    XAConnection XAConn = null;
//    try {
//      XAConn = dataSource.getXAConnection();
//    } catch (SQLException e) {
//      e.printStackTrace();
//    }
//    return XAConn;
//  }
//
//  public static Connection getConnection(XAConnection XAConn) {
//    Connection conn = null;
//    try {
//      conn = XAConn.getConnection();
//    } catch (SQLException e) {
//      e.printStackTrace();
//    }
//    return conn;
//  }
//
//  public static void closeConnection(Connection conn) {
//    try {
//      conn.close();
//    } catch (SQLException e) {
//      System.out.println("连接关闭失败");
//    }
//  }
//
//}
